package org.lvgo.singleton.lazy;

/**
 * 这种方式是最基本的实现方式，这种实现最大的问题就是不支持多线程。
 * 因为没有加锁 synchronized，所以严格意义上它并不算单例模式。
 * <p>
 * 这种方式 lazy loading 很明显，不要求线程安全，在多线程不能正常工作。
 *
 * @author lvgo
 * @version 1.0
 * @Description: 懒加载, 线程不安全
 * @date 18-8-22 上午11:52
 */
public class LazyLoadingSingleton2 {

    private static LazyLoadingSingleton2 lazyLoadingSingleton2;

    private LazyLoadingSingleton2() {
        // 解决反射创建对象破解单例模式
        if (lazyLoadingSingleton2 == null) {
            lazyLoadingSingleton2 = this;
        } else {
            throw new IllegalStateException("Already initialized");
        }
    }

    public static LazyLoadingSingleton2 getInstance() {
        if (lazyLoadingSingleton2 == null) {
            lazyLoadingSingleton2 = new LazyLoadingSingleton2();
        }
        return lazyLoadingSingleton2;
    }

    /**
     * 解决反序列化创建对象破坏单例模式
     */
    private Object readResolve() {
        return lazyLoadingSingleton2;
    }
}
